home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / xml4j.jar / com / ibm / xml / xpointer / XPointer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-08-30  |  8.4 KB  |  557 lines

  1. package com.ibm.xml.xpointer;
  2.  
  3. import com.ibm.xml.parser.AttDef;
  4. import com.ibm.xml.parser.Child;
  5. import com.ibm.xml.parser.DTD;
  6. import com.ibm.xml.parser.LibraryException;
  7. import com.ibm.xml.parser.Parent;
  8. import com.ibm.xml.parser.TXDocument;
  9. import com.ibm.xml.parser.TXElement;
  10. import java.io.Serializable;
  11. import java.util.Enumeration;
  12. import java.util.Vector;
  13. import org.w3c.dom.Attr;
  14. import org.w3c.dom.Document;
  15. import org.w3c.dom.Element;
  16. import org.w3c.dom.Node;
  17.  
  18. public class XPointer implements Serializable {
  19.    static final long serialVersionUID = 5186377505549567985L;
  20.    public static final String S_ALL = "all";
  21.    public static final String S_END = "end";
  22.    public static final int NT_NONE = 0;
  23.    public static final int NT_NAME = 1;
  24.    public static final int NT_ELEMENT = 2;
  25.    public static final int NT_PI = 3;
  26.    public static final int NT_COMMENT = 4;
  27.    public static final int NT_TEXT = 5;
  28.    public static final int NT_CDATA = 6;
  29.    public static final int NT_ALL = 7;
  30.    public static final String[] nodetypes = new String[]{null, null, "#element", "#pi", "#comment", "#text", "#cdata", "#all"};
  31.    public static final String S_ELEMENT = "element";
  32.    public static final String S_PI = "pi";
  33.    public static final String S_COMMENT = "comment";
  34.    public static final String S_TEXT = "text";
  35.    public static final String S_CDATA = "cdata";
  36.    public static final String S_NIMPLIED = "#IMPLIED";
  37.    public static final String S_IMPLIED = "IMPLIED";
  38.    public static final String[] literals = new String[]{null, "root", "origin", "id", "html", "child", "descendant", "ancestor", "preceding", "psibling", "following", "fsibling", "span", "attr", "string"};
  39.    public static final int ST_NONE = -1;
  40.    public static final int ST_ROOT = 1;
  41.    public static final int ST_ORIGIN = 2;
  42.    public static final int ST_ID = 3;
  43.    public static final int ST_HTML = 4;
  44.    public static final int ST_CHILD = 5;
  45.    public static final int ST_DESCENDANT = 6;
  46.    public static final int ST_ANCESTOR = 7;
  47.    public static final int ST_PRECEDING = 8;
  48.    public static final int ST_PSIBLING = 9;
  49.    public static final int ST_FOLLOWING = 10;
  50.    public static final int ST_FSIBLING = 11;
  51.    public static final int ST_SPAN = 12;
  52.    public static final int ST_ATTR = 13;
  53.    public static final int ST_STRING = 14;
  54.    public static final int T_IMPLIED = 0;
  55.    public static final int T_ANY = 1;
  56.    public static final int T_NAME = 2;
  57.    public static final int T_EXACT = 3;
  58.    AbsTerm absTerm;
  59.    Vector otherTerms;
  60.    String string;
  61.    private transient int previous = -1;
  62.  
  63.    public XPointer(AbsTerm var1, Vector var2) {
  64.       this.absTerm = var1;
  65.       this.otherTerms = var2 == null ? new Vector() : var2;
  66.    }
  67.  
  68.    public AbsTerm getAbsTerm() {
  69.       return this.absTerm;
  70.    }
  71.  
  72.    public void setAbsTerm(AbsTerm var1) {
  73.       this.absTerm = var1;
  74.       this.string = null;
  75.    }
  76.  
  77.    public Vector getOtherTermsVector() {
  78.       return this.otherTerms;
  79.    }
  80.  
  81.    public void appendOtherTerm(OtherTerm var1) {
  82.       if (this.otherTerms == null) {
  83.          this.otherTerms = new Vector();
  84.       }
  85.  
  86.       this.otherTerms.addElement(var1);
  87.       this.string = null;
  88.    }
  89.  
  90.    public void insertOtherTerm(OtherTerm var1) {
  91.       if (this.otherTerms == null) {
  92.          this.otherTerms = new Vector();
  93.       }
  94.  
  95.       this.otherTerms.insertElementAt(var1, 0);
  96.       this.string = null;
  97.    }
  98.  
  99.    public OtherTerm removeLastOtherTerm() {
  100.       OtherTerm var1 = null;
  101.       Vector var2 = this.otherTerms;
  102.       synchronized(var2){}
  103.  
  104.       try {
  105.          int var4 = this.otherTerms.size();
  106.          if (var4 > 0) {
  107.             var1 = (OtherTerm)this.otherTerms.elementAt(var4 - 1);
  108.             this.otherTerms.removeElementAt(var4 - 1);
  109.          }
  110.       } catch (Throwable var6) {
  111.          throw var6;
  112.       }
  113.  
  114.       this.string = null;
  115.       return var1;
  116.    }
  117.  
  118.    public String toString() {
  119.       if (this.string != null) {
  120.          return this.string;
  121.       } else {
  122.          StringBuffer var1 = new StringBuffer(100);
  123.          if (this.absTerm != null) {
  124.             var1.append(this.absTerm.toString());
  125.             if (this.otherTerms.size() > 0) {
  126.                var1.append(".");
  127.             }
  128.          }
  129.  
  130.          int var2 = 0;
  131.          Enumeration var3 = this.otherTerms.elements();
  132.  
  133.          while(var3.hasMoreElements()) {
  134.             if (var2 > 0) {
  135.                var1.append(".");
  136.             }
  137.  
  138.             ++var2;
  139.             var1.append(var3.nextElement().toString());
  140.          }
  141.  
  142.          return this.string = var1.toString();
  143.       }
  144.    }
  145.  
  146.    public synchronized Pointed point(Document var1) {
  147.       Element var2 = var1.getDocumentElement();
  148.       if (this.absTerm != null && this.absTerm.getType() != 1) {
  149.          if (this.absTerm.getType() == 2 || this.absTerm.getType() == 4) {
  150.             return new Pointed();
  151.          }
  152.  
  153.          DTD var3 = ((TXDocument)var1).getDTD();
  154.          if (var3 == null) {
  155.             return new Pointed();
  156.          }
  157.  
  158.          var2 = var3.checkID(this.absTerm.getParameter());
  159.          if (var2 == null) {
  160.             return new Pointed();
  161.          }
  162.       }
  163.  
  164.       return this.point((Node)var2);
  165.    }
  166.  
  167.    public synchronized Pointed point(Node var1) {
  168.       Pointed var2 = new Pointed();
  169.       var2.add(var1);
  170.       this.previous = -1;
  171.  
  172.       Pointed var5;
  173.       for(Enumeration var3 = this.otherTerms.elements(); var3.hasMoreElements(); var2 = var5) {
  174.          Object var4 = var3.nextElement();
  175.          var5 = new Pointed();
  176.          Enumeration var6 = ((Vector)var2).elements();
  177.  
  178.          while(var6.hasMoreElements()) {
  179.             Pointed.Item var7 = (Pointed.Item)var6.nextElement();
  180.             if (var7.node != null) {
  181.                this.point(var5, var4, (Child)var7.node);
  182.             }
  183.          }
  184.       }
  185.  
  186.       return var2;
  187.    }
  188.  
  189.    public static XPointer makeXPointer(Child var0) {
  190.       if (var0.getNodeType() == 9) {
  191.          return null;
  192.       } else if (var0.getNodeType() == 5) {
  193.          return null;
  194.       } else {
  195.          Child var1 = var0;
  196.  
  197.          while(var1.getNodeType() != 9) {
  198.             var1 = (Child)var1.getParentNode();
  199.             if (var1 == null) {
  200.                return null;
  201.             }
  202.          }
  203.  
  204.          TXDocument var2 = (TXDocument)var1;
  205.          if (var0.getParentNode() == var2) {
  206.             return new XPointer(new AbsTerm(1, (String)null), (Vector)null);
  207.          } else {
  208.             DTD var3 = var2.getDTD();
  209.             if (var3 != null) {
  210.                Child var4 = var0.getNodeType() != 1 ? (Child)var0.getParentWithoutReference() : var0;
  211.  
  212.                do {
  213.                   TXElement var5 = (TXElement)var4;
  214.                   Enumeration var6 = var5.attributeElements();
  215.  
  216.                   while(var6.hasMoreElements()) {
  217.                      Attr var7 = (Attr)var6.nextElement();
  218.                      AttDef var8 = var3.getAttributeDeclaration(var5.getNodeName(), var7.getName());
  219.                      if (var8 != null && var8.getDeclaredType() == 2) {
  220.                         XPointer var9 = new XPointer(new AbsTerm(3, var7.getValue()), (Vector)null);
  221.                         if (var5 != var0) {
  222.                            var1 = var0;
  223.                            Object var10 = null;
  224.  
  225.                            do {
  226.                               var9.insertOtherTerm(var17 = makeRelTerm(var1));
  227.                               var1 = (Child)var1.getParentWithoutReference();
  228.                            } while(var1 != var5);
  229.  
  230.                            var17.setType(5);
  231.                         }
  232.  
  233.                         return var9;
  234.                      }
  235.                   }
  236.  
  237.                   var4 = (Child)var4.getParentWithoutReference();
  238.                } while(!(var4 instanceof TXDocument));
  239.             }
  240.  
  241.             TXElement var13 = (TXElement)var2.getDocumentElement();
  242.             XPointer var14 = new XPointer(new AbsTerm(1, (String)null), (Vector)null);
  243.             var1 = var0;
  244.             Object var15 = null;
  245.  
  246.             do {
  247.                var14.insertOtherTerm(var16 = makeRelTerm(var1));
  248.                var1 = (Child)var1.getParentWithoutReference();
  249.             } while(var1 != var13);
  250.  
  251.             var16.setType(5);
  252.             return var14;
  253.          }
  254.       }
  255.    }
  256.  
  257.    private void point(Pointed var1, Object var2, Child var3) {
  258.       if (!(var2 instanceof RelTerm)) {
  259.          if (var2 instanceof StringTerm) {
  260.             this.previous = -1;
  261.          } else if (var2 instanceof SpanTerm) {
  262.             this.previous = -1;
  263.          } else if (var2 instanceof AttrTerm) {
  264.             this.previous = -1;
  265.             if (var3 instanceof Element) {
  266.                Attr var10 = ((Element)var3).getAttributeNode(((AttrTerm)var2).getName());
  267.                if (var10 != null) {
  268.                   var1.add(var10.getValue());
  269.                   return;
  270.                }
  271.             }
  272.  
  273.          } else {
  274.             throw new LibraryException("com.ibm.xml.xpointer.XPointer#point(): Internal Error: unknown OtherTerm.");
  275.          }
  276.       } else {
  277.          RelTerm var4 = (RelTerm)var2;
  278.          int var5 = var4.getType();
  279.          if (var5 == -1) {
  280.             if (this.previous == -1) {
  281.                return;
  282.             }
  283.  
  284.             var5 = this.previous;
  285.          }
  286.  
  287.          int var6 = var4.getInstance();
  288.          if (var6 != 0) {
  289.             label299:
  290.             switch (var5) {
  291.                case 5:
  292.                   if (var4.isAll()) {
  293.                      for(Child var17 = (Child)var3.getFirstWithoutReference(); var17 != null; var17 = (Child)var17.getNextWithoutReference()) {
  294.                         if (var4.match(var17)) {
  295.                            var1.add(var17);
  296.                         }
  297.                      }
  298.                   } else if (var6 > 0) {
  299.                      for(Child var18 = (Child)var3.getFirstWithoutReference(); var18 != null; var18 = (Child)var18.getNextWithoutReference()) {
  300.                         if (var4.match(var18)) {
  301.                            --var6;
  302.                            if (var6 == 0) {
  303.                               var1.add(var18);
  304.                               break label299;
  305.                            }
  306.                         }
  307.                      }
  308.                   } else {
  309.                      for(Child var19 = (Child)var3.getLastWithoutReference(); var19 != null; var19 = (Child)var19.getPreviousWithoutReference()) {
  310.                         if (var4.match(var19)) {
  311.                            ++var6;
  312.                            if (var6 == 0) {
  313.                               var1.add(var19);
  314.                               break label299;
  315.                            }
  316.                         }
  317.                      }
  318.                   }
  319.                   break;
  320.                case 6:
  321.                   if (!(var3 instanceof Element)) {
  322.                      return;
  323.                   }
  324.  
  325.                   Vector var15 = new Vector();
  326.                   addMatchingNodes(var15, (Element)var3, var4);
  327.                   if (var4.isAll()) {
  328.                      for(int var22 = 0; var22 < var15.size(); ++var22) {
  329.                         var1.add((Node)var15.elementAt(var22));
  330.                      }
  331.                   } else if (var6 > 0) {
  332.                      if (var6 <= var15.size()) {
  333.                         var1.add((Node)var15.elementAt(var6 - 1));
  334.                      }
  335.                   } else if (var6 + var15.size() >= 0) {
  336.                      var1.add((Node)var15.elementAt(var6 + var15.size()));
  337.                   }
  338.                   break;
  339.                case 7:
  340.                   Vector var14 = new Vector();
  341.  
  342.                   while(var3.getParentWithoutReference() instanceof Element) {
  343.                      var3 = (Child)var3.getParentWithoutReference();
  344.                      if (var4.match(var3)) {
  345.                         var14.addElement(var3);
  346.                      }
  347.                   }
  348.  
  349.                   if (var4.isAll()) {
  350.                      for(int var21 = 0; var21 < var14.size(); ++var21) {
  351.                         var1.add((Node)var14.elementAt(var21));
  352.                      }
  353.                   } else if (var6 > 0) {
  354.                      if (var6 <= var14.size()) {
  355.                         var1.add((Node)var14.elementAt(var6 - 1));
  356.                      }
  357.                   } else if (var6 + var14.size() >= 0) {
  358.                      var1.add((Node)var14.elementAt(var6 + var14.size()));
  359.                   }
  360.                   break;
  361.                case 8:
  362.                   Vector var13 = new Vector();
  363.  
  364.                   while(var3.getPreviousWithoutReference() != null || var3.getParentWithoutReference() instanceof Element) {
  365.                      if (var3.getPreviousWithoutReference() == null) {
  366.                         var3 = (Child)var3.getParentWithoutReference();
  367.                      } else {
  368.                         var3 = (Child)var3.getPreviousWithoutReference();
  369.                      }
  370.  
  371.                      if (var4.match(var3)) {
  372.                         var13.addElement(var3);
  373.                      }
  374.                   }
  375.  
  376.                   if (var4.isAll()) {
  377.                      for(int var20 = 0; var20 < var13.size(); ++var20) {
  378.                         var1.add((Node)var13.elementAt(var20));
  379.                      }
  380.                   } else if (var6 > 0) {
  381.                      if (var6 <= var13.size()) {
  382.                         var1.add((Node)var13.elementAt(var6 - 1));
  383.                      }
  384.                   } else if (var6 + var13.size() >= 0) {
  385.                      var1.add((Node)var13.elementAt(var6 + var13.size()));
  386.                   }
  387.                   break;
  388.                case 9:
  389.                   if (var4.isAll()) {
  390.                      while((var3 = (Child)var3.getPreviousWithoutReference()) != null) {
  391.                         if (var4.match(var3)) {
  392.                            var1.add(var3);
  393.                         }
  394.                      }
  395.                   } else if (var6 > 0) {
  396.                      while((var3 = (Child)var3.getPreviousWithoutReference()) != null) {
  397.                         if (var4.match(var3)) {
  398.                            --var6;
  399.                            if (var6 == 0) {
  400.                               var1.add(var3);
  401.                               break label299;
  402.                            }
  403.                         }
  404.                      }
  405.                   } else {
  406.                      var6 = Math.abs(var6);
  407.  
  408.                      for(Child var16 = (Child)((Child)var3.getParentWithoutReference()).getFirstWithoutReference(); var16 != null; var16 = (Child)var16.getNextWithoutReference()) {
  409.                         if (var4.match(var16)) {
  410.                            ++var6;
  411.                            if (var6 == 0) {
  412.                               var1.add(var16);
  413.                               break label299;
  414.                            }
  415.                         }
  416.                      }
  417.                   }
  418.                   break;
  419.                case 10:
  420.                   Vector var7 = new Vector();
  421.  
  422.                   while(var3.getNextWithoutReference() != null || var3.getParentWithoutReference() instanceof Element) {
  423.                      if (var3.getNextWithoutReference() == null) {
  424.                         var3 = (Child)var3.getParentWithoutReference();
  425.                      } else {
  426.                         var3 = (Child)var3.getNextWithoutReference();
  427.                      }
  428.  
  429.                      if (var4.match(var3)) {
  430.                         var7.addElement(var3);
  431.                      }
  432.                   }
  433.  
  434.                   if (var4.isAll()) {
  435.                      for(int var9 = 0; var9 < var7.size(); ++var9) {
  436.                         var1.add((Node)var7.elementAt(var9));
  437.                      }
  438.                   } else if (var6 > 0) {
  439.                      if (var6 <= var7.size()) {
  440.                         var1.add((Node)var7.elementAt(var6 - 1));
  441.                      }
  442.                   } else if (var6 + var7.size() >= 0) {
  443.                      var1.add((Node)var7.elementAt(var6 + var7.size()));
  444.                   }
  445.                   break;
  446.                case 11:
  447.                   if (var4.isAll()) {
  448.                      while((var3 = (Child)var3.getNextWithoutReference()) != null) {
  449.                         if (var4.match(var3)) {
  450.                            var1.add(var3);
  451.                         }
  452.                      }
  453.                   } else if (var6 > 0) {
  454.                      while((var3 = (Child)var3.getNextWithoutReference()) != null) {
  455.                         if (var4.match(var3)) {
  456.                            --var6;
  457.                            if (var6 == 0) {
  458.                               var1.add(var3);
  459.                               break;
  460.                            }
  461.                         }
  462.                      }
  463.                   } else {
  464.                      var6 = Math.abs(var6);
  465.  
  466.                      for(Child var8 = (Child)((Child)var3.getParentWithoutReference()).getLastWithoutReference(); var8 != null; var8 = (Child)var8.getPreviousWithoutReference()) {
  467.                         if (var4.match(var8)) {
  468.                            ++var6;
  469.                            if (var6 == 0) {
  470.                               var1.add(var8);
  471.                               break;
  472.                            }
  473.                         }
  474.                      }
  475.                   }
  476.             }
  477.  
  478.             this.previous = var5;
  479.          }
  480.       }
  481.    }
  482.  
  483.    private static void addMatchingNodes(Vector var0, Element var1, RelTerm var2) {
  484.       for(Node var3 = ((Child)var1).getFirstWithoutReference(); var3 != null; var3 = ((Child)var3).getNextWithoutReference()) {
  485.          if (var2.match(var3)) {
  486.             var0.addElement(var3);
  487.          }
  488.  
  489.          if (var3 instanceof Element) {
  490.             addMatchingNodes(var0, (Element)var3, var2);
  491.          }
  492.       }
  493.  
  494.    }
  495.  
  496.    private static RelTerm makeRelTerm(Child var0) throws LibraryException, IllegalArgumentException {
  497.       Parent var1 = (Parent)var0.getParentWithoutReference();
  498.       short var2 = var0.getNodeType();
  499.       int var3 = 1;
  500.       switch (var2) {
  501.          case 1:
  502.             String var4 = var0.getNodeName();
  503.  
  504.             for(Node var8 = var1.getFirstWithoutReference(); var8 != null; var8 = ((Child)var8).getNextWithoutReference()) {
  505.                if (var8.getNodeType() == var2 && var8.getNodeName().equals(var4)) {
  506.                   if (var8 == var0) {
  507.                      return new RelTerm(-1, var3, var4);
  508.                   }
  509.  
  510.                   ++var3;
  511.                }
  512.             }
  513.             break;
  514.          case 2:
  515.          case 5:
  516.          case 6:
  517.          default:
  518.             throw new IllegalArgumentException("com.ibm.xml.xpointer.XPointer#makeRelTerm():");
  519.          case 3:
  520.             for(Node var7 = var1.getFirstWithoutReference(); var7 != null; var7 = ((Child)var7).getNextWithoutReference()) {
  521.                if (var7.getNodeType() == var2) {
  522.                   if (var7 == var0) {
  523.                      return new RelTerm(-1, var3, 5);
  524.                   }
  525.  
  526.                   ++var3;
  527.                }
  528.             }
  529.             break;
  530.          case 4:
  531.             for(Node var6 = var1.getFirstWithoutReference(); var6 != null; var6 = ((Child)var6).getNextWithoutReference()) {
  532.                if (var6.getNodeType() == var2) {
  533.                   if (var6 == var0) {
  534.                      return new RelTerm(-1, var3, 6);
  535.                   }
  536.  
  537.                   ++var3;
  538.                }
  539.             }
  540.             break;
  541.          case 7:
  542.          case 8:
  543.             for(Node var5 = var1.getFirstWithoutReference(); var5 != null; var5 = ((Child)var5).getNextWithoutReference()) {
  544.                if (var5.getNodeType() == var2) {
  545.                   if (var5 == var0) {
  546.                      return new RelTerm(-1, var3, var2 == 8 ? 4 : 3);
  547.                   }
  548.  
  549.                   ++var3;
  550.                }
  551.             }
  552.       }
  553.  
  554.       throw new LibraryException("com.ibm.xml.xpointer.XPointer#makeRelTerm(): Specified child isn't a child of specified element.");
  555.    }
  556. }
  557.